package hotel;

import java.awt.*;
import java.awt.event.*;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.*;
import java.sql.*;
import java.sql.Date;

import java.util.*;

import javax.swing.*;
import javax.swing.filechooser.FileNameExtensionFilter;

import com.toedter.calendar.JDateChooser;

public class AggiungiCliente extends JFrame implements ActionListener {
	ImageIcon iconav = new ImageIcon("Risorse/iconav.png"),
			iconax = new ImageIcon("Risorse/iconax.png");
	private ResultSet rs = null;
	private Vector<String> row;
	private GraficaHotel g;
	private GregorianCalendar gc = new GregorianCalendar();
	private String dataCorrente = gc.get(GregorianCalendar.YEAR) + "/"
			+ (gc.get(GregorianCalendar.MONTH) + 1) + "/"
			+ gc.get(GregorianCalendar.DAY_OF_MONTH);
	private int annoCorrente = gc.get(GregorianCalendar.YEAR);
	private JTextField nome, cognome, dataDiNascita, comuneDiNascita,
			numeroDocumento, rilasciato, residenza, dataRilascio, email;
	private JLabel nomeL, cognomeL, dataDiNascitaL, comuneDiNascitaL,
			residenzaL, tipoDocumentoL, numeroDocumentoL, rilasciatoL,
			provinciaL1, provinciaL2, dataRilascioL, emailL;
	private JButton aggiungi, scansione;
	private String patternNome = "[a-zA-Z ]*";
	private JPanel p;
	private JDateChooser chooser1, chooser2;
	private Calendar cal1, cal2;
	private JFileChooser fc = new JFileChooser();
	private String indirizzo;
	private File file;
	private JComboBox<String> tipoDocumento, provinciaN, provinciaR;
	private String[] tipi = { "C.Identitita", "Patente", "Passaporto" };
	private String[] province = { "--", "AG", "AL", "AN", "AO", "AR", "AP",
			"AT", "AV", "BA", "BT", "BL", "BN", "BG", "BO", "BZ", "BS", "BR",
			"CA", "CL", "CB", "CI", "CE", "CT", "CZ", "CH", "CO", "CS", "CR",
			"KR", "CN", "EN", "FM", "FE", "FI", "FG", "FC", "FR", "GE", "GO",
			"GR", "IM", "IS", "SP", "AQ", "LT", "LE", "LC", "LI", "LO", "LU",
			"MC", "MN", "MS", "MT", "ME", "MI", "MO", "MB", "NA", "NO", "NU",
			"OT", "OR", "PD", "PA", "PR", "PV", "PG", "PU", "PE", "PC", "PI",
			"PT", "PN", "PZ", "PO", "RG", "RA", "RC", "RE", "RI", "RN", "RM",
			"RO", "SA", "VS", "SS", "SV", "SI", "SR", "SO", "TA", "TE", "TR",
			"TO", "OG", "TP", "TN", "TV", "TS", "UD", "VA", "VE", "VB", "VC",
			"VR", "VV", "VI", "VT" };
	private JComboBox dataDiNascitaG, dataDiNascitaM, dataDiNascitaY,
			dataRilascioG, dataRilascioM, dataRilascioY;
	private JLabel dataU;
	private Image immagineIc;

	public AggiungiCliente(GraficaHotel g, String key, boolean image)
			throws SQLException, IOException {
		this.g = g;
		if (image) {
			immagineIc = Toolkit.getDefaultToolkit().getImage(
					"Risorse/addPImg1.png");
		} else
			immagineIc = Toolkit.getDefaultToolkit().getImage(
					"Risorse/setPImg1.png");
		setIconImage(immagineIc);
		this.setSize(700, 150);
		this.setTitle("Aggiungi Cliente");
		this.setLocation(350, 250);
		this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		this.setResizable(false);
		p = new JPanel(new GridLayout(0, 2));
		nomeL = new JLabel("Nome");
		nome = new JTextField(10);
		p.add(nomeL);
		p.add(nome);
		cognomeL = new JLabel("Cognome");
		cognome = new JTextField(10);
		p.add(cognomeL);
		p.add(cognome);
		dataDiNascitaL = new JLabel("Data di Nascita");
		p.add(dataDiNascitaL);
		chooser1 = new JDateChooser();
		chooser1.setDateFormatString("dd/MM/yyyy");
		chooser1.addPropertyChangeListener(new PropertyChangeListener() {
			public void propertyChange(PropertyChangeEvent e) {
				cal1 = chooser1.getCalendar();
			}
		});
		p.add(chooser1);
		comuneDiNascitaL = new JLabel("Comune di Nascita");
		comuneDiNascita = new JTextField();
		p.add(comuneDiNascitaL);
		p.add(comuneDiNascita);
		provinciaL1 = new JLabel("Provincia");
		provinciaN = new JComboBox(province);
		p.add(provinciaL1);
		p.add(provinciaN);
		residenzaL = new JLabel("Residenza");
		residenza = new JTextField();
		p.add(residenzaL);
		p.add(residenza);
		provinciaL2 = new JLabel("Provincia");
		provinciaR = new JComboBox(province);
		p.add(provinciaL2);
		p.add(provinciaR);
		tipoDocumentoL = new JLabel("Tipo Documento");
		tipoDocumento = new JComboBox(tipi);
		p.add(tipoDocumentoL);
		p.add(tipoDocumento);
		numeroDocumentoL = new JLabel("Numero Documento");
		numeroDocumento = new JTextField();
		p.add(numeroDocumentoL);
		p.add(numeroDocumento);
		rilasciatoL = new JLabel("Rilasciato da");
		rilasciato = new JTextField();
		p.add(rilasciatoL);
		p.add(rilasciato);
		dataRilascioL = new JLabel("Data di rilascio");
		p.add(dataRilascioL);
		chooser2 = new JDateChooser();
		chooser2.setDateFormatString("dd/MM/yyyy");
		chooser2.addPropertyChangeListener(new PropertyChangeListener() {
			public void propertyChange(PropertyChangeEvent e) {
				cal2 = chooser2.getCalendar();
			}
		});
		p.add(chooser2);
		emailL = new JLabel("E-Mail");
		email = new JTextField(15);
		p.add(emailL);
		p.add(email);
		scansione = new JButton("Scansione Documento");
		scansione.addActionListener(this);
		p.add(scansione);
		p.add(new JLabel());
		p.add(new JLabel("Ultimo Arrivo:"));
		dataU = new JLabel(dataCorrente);
		p.add(dataU);
		p.add(new JLabel());
		aggiungi = new JButton("Aggiungi Cliente");
		aggiungi.addActionListener(this);
		if (!key.equals("0")) {
			inserisciDati(key);
		}
		p.add(new JLabel());
		p.add(new JLabel());
		p.add(aggiungi);
		add(p);
		pack();
		setVisible(true);
	}

	private void inserisciDati(String key) {
		try {
			int i = 1;
			rs = g.database.stat
					.executeQuery("SELECT nome,cognome,datadinascita,"
							+ "comunedinascita,provinciadinascita,residenza,provinciadiresidenza,"
							+ "tipodidocumento,numerodidocumento,rilasciatoda,"
							+ "datadirilascio,"
							+ "DATE_FORMAT(datadiarrivo,'%d/%m/%Y'),"
							+ "indirizzo,email FROM CLIENTI "
							+ "where numerodidocumento='" + key + "'");
			rs.next();
			nome.setText(rs.getString(i));
			i++;
			cognome.setText(rs.getString(i++));
			Date dataNas = rs.getDate(i++);
			chooser1.setDate(dataNas);
			comuneDiNascita.setText(rs.getString(i++));
			provinciaN.setSelectedItem(rs.getString(i++));
			residenza.setText(rs.getString(i++));
			provinciaR.setSelectedItem(rs.getString(i++));
			tipoDocumento.setSelectedItem(rs.getString(i++));
			numeroDocumento.setText(rs.getString(i++));
			numeroDocumento.setEditable(false);
			rilasciato.setText(rs.getString(i++));
			Date datRis = rs.getDate(i++);
			chooser2.setDate(datRis);
			dataU.setText(rs.getString(i++));
			i++;
			email.setText(rs.getString(i++));
			aggiungi.setText("Aggiorna");
			this.setTitle("Modifica Cliente");
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		if (e.getSource() == scansione) {
			fc.setAcceptAllFileFilterUsed(false);
			FileNameExtensionFilter fn = new FileNameExtensionFilter(
					"Tutte le Immagini", "jpg", "gif", "png", "bmp");
			fc.addChoosableFileFilter(fn);
			if (fc.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) {
				file = fc.getSelectedFile();
				indirizzo = file.getPath();
				indirizzo = indirizzo.replace("\\", "\\\\");
			}
		}
		if (e.getSource() == aggiungi
				&& aggiungi.getText().equals("Aggiungi Cliente")) {
			int var = controlla();
			tuttiNeri();
			if (var == 0) {
				String n = nome.getText();
				String c = cognome.getText();
				// String d = dataDiNascitaY.getSelectedItem() + "/"
				// + trova((String) dataDiNascitaM.getSelectedItem())
				// + "/" + dataDiNascitaG.getSelectedItem();
				String d = "" + cal1.get(Calendar.YEAR) + "/"
						+ (cal1.get(Calendar.MONTH) + 1) + "/"
						+ cal1.get(Calendar.DATE);
				String cd = comuneDiNascita.getText();
				String p = (String) provinciaN.getSelectedItem();
				String r = residenza.getText();
				String p1 = (String) provinciaR.getSelectedItem();
				String t = (String) tipoDocumento.getSelectedItem();
				String nd = numeroDocumento.getText();
				String rd = rilasciato.getText();
				// String dr = dataRilascioY.getSelectedItem() + "/"
				// + trova((String) dataRilascioM.getSelectedItem()) + "/"
				// + dataRilascioG.getSelectedItem();
				String em = email.getText();
				String dr = "" + cal2.get(Calendar.YEAR) + "/"
						+ (cal2.get(Calendar.MONTH) + 1) + "/"
						+ cal2.get(Calendar.DATE);
				String query = "INSERT INTO CLIENTI"
						+ "(nome,cognome,datadinascita,comunedinascita,"
						+ "provinciadinascita,residenza,provinciadiresidenza,tipodidocumento,numerodidocumento,"
						+ "rilasciatoda,datadirilascio,datadiarrivo,indirizzo,email) values('"
						+ n
						+ "','"
						+ c
						+ "','"
						+ d
						+ "','"
						+ cd
						+ "','"
						+ p
						+ "','"
						+ r
						+ "','"
						+ p1
						+ "','"
						+ t
						+ "','"
						+ nd
						+ "','"
						+ rd
						+ "','"
						+ dr
						+ "','"
						+ dataCorrente
						+ "','" + indirizzo + "','" + em + "')";
				try {
					int codiceSuccesso = g.database.query(query);
					if (codiceSuccesso == 1) {
						JOptionPane.showMessageDialog(null,
								"Cliente registrato con successo!", "Ottimo",
								JOptionPane.INFORMATION_MESSAGE, iconav);
						if (g.tutti.isSelected()
								&& g.cerca.getText().equals(""))
							aggiungiRiga();
						this.dispose();
					} else if (codiceSuccesso == 1062) {
						JOptionPane.showMessageDialog(null,
								"Cliente gia' registrato!", "ERRORE",
								JOptionPane.ERROR_MESSAGE, iconax);
						this.setVisible(true);
					} else if (codiceSuccesso == 1292) {
						JOptionPane.showMessageDialog(null,
								"Date non corrette!", "ERRORE",
								JOptionPane.ERROR_MESSAGE, iconax);
						this.setVisible(true);
					}
				} catch (SQLException | IOException e1) {
					System.out.println(e1.getMessage() + " +++++");
				}
			} else {
				if (var == 1)
					nomeL.setForeground(Color.RED);
				else if (var == 2)
					cognomeL.setForeground(Color.RED);
				else if (var == 3)
					dataDiNascitaL.setForeground(Color.RED);
				else if (var == 4)
					comuneDiNascitaL.setForeground(Color.RED);
				else if (var == 5)
					provinciaL1.setForeground(Color.RED);
				else if (var == 6)
					residenzaL.setForeground(Color.RED);
				else if (var == 7)
					provinciaL2.setForeground(Color.RED);
				else if (var == 8)
					numeroDocumentoL.setForeground(Color.RED);
				else if (var == 9)
					dataRilascioL.setForeground(Color.RED);
				else if (var == 10)
					emailL.setForeground(Color.RED);
			}
		} else if (e.getSource() == aggiungi
				&& aggiungi.getText().equals("Aggiorna")) {
			int var = controlla();
			tuttiNeri();
			if (var == 0) {
				String n = nome.getText();
				String c = cognome.getText();
				String d = "" + cal1.get(Calendar.YEAR) + "/"
						+ (cal1.get(Calendar.MONTH) + 1) + "/"
						+ cal1.get(Calendar.DATE);
				String cd = comuneDiNascita.getText();
				String p = (String) provinciaN.getSelectedItem();
				String r = residenza.getText();
				String p1 = (String) provinciaR.getSelectedItem();
				String t = (String) tipoDocumento.getSelectedItem();
				String nd = numeroDocumento.getText();
				String rd = rilasciato.getText();
				String dr = "" + cal2.get(Calendar.YEAR) + "/"
						+ (cal2.get(Calendar.MONTH) + 1) + "/"
						+ cal2.get(Calendar.DATE);
				String query = "UPDATE CLIENTI SET nome='" + n + "'"
						+ ",cognome='" + c + "'" + ",datadinascita='" + d + "'"
						+ ",comunedinascita='" + cd + "'"
						+ ",provinciadinascita='" + p + "'" + ",residenza='"
						+ r + "'" + ",provinciadiresidenza='" + p1 + "'"
						+ ",tipodidocumento='" + t + "'" + ",rilasciatoda='"
						+ rd + "'" + ",datadirilascio='" + dr + "'"
						+ ",indirizzo='" + indirizzo + "'" + ",email='"
						+ email.getText() + "'" + " WHERE numerodidocumento='"
						+ nd + "'";

				try {
					int codiceSuccesso = g.database.query(query);
					if (codiceSuccesso == 1) {
						JOptionPane.showMessageDialog(null,
								"Cliente aggiornato con successo!", "Ottimo",
								JOptionPane.INFORMATION_MESSAGE, iconav);
						g.setVisible(true);
						this.dispose();
					} else if (codiceSuccesso == 1292) {
						JOptionPane.showMessageDialog(null,
								"Date non corrette!", "ERRORE",
								JOptionPane.ERROR_MESSAGE, iconax);
						this.setVisible(true);
					}
				} catch (SQLException | IOException e1) {
					System.out.println(e1.getMessage());
				}
			} else {
				if (var == 1)
					nomeL.setForeground(Color.RED);
				else if (var == 2)
					cognomeL.setForeground(Color.RED);
				else if (var == 3)
					dataDiNascitaL.setForeground(Color.RED);
				else if (var == 4)
					comuneDiNascitaL.setForeground(Color.RED);
				else if (var == 5)
					provinciaL1.setForeground(Color.RED);
				else if (var == 6)
					residenzaL.setForeground(Color.RED);
				else if (var == 7)
					provinciaL2.setForeground(Color.RED);
				else if (var == 8)
					numeroDocumentoL.setForeground(Color.RED);
				else if (var == 9)
					dataRilascioL.setForeground(Color.RED);
				else if (var == 10)
					emailL.setForeground(Color.RED);
			}
		}

	}

	private int trova(String mese) {
		if (mese.equals("Gennaio"))
			return 1;
		else if (mese.equals("Febbraio"))
			return 2;
		else if (mese.equals("Marzo"))
			return 3;
		else if (mese.equals("Aprile"))
			return 4;
		else if (mese.equals("Maggio"))
			return 5;
		else if (mese.equals("Giugno"))
			return 6;
		else if (mese.equals("Luglio"))
			return 7;
		else if (mese.equals("Agosto"))
			return 8;
		else if (mese.equals("Settembre"))
			return 9;
		else if (mese.equals("Ottobre"))
			return 10;
		else if (mese.equals("Novembre"))
			return 11;
		else
			return 12;
	}

	private int controlla() {
		if (nome.getText().equals("") || !nome.getText().matches(patternNome))
			return 1;
		if (cognome.getText().equals("")
				|| !cognome.getText().matches(patternNome))
			return 2;
		if (chooser1.getCalendar() == null) {
			return 3;
		}
		if (comuneDiNascita.getText().equals("")
				|| !comuneDiNascita.getText().matches(patternNome))
			return 4;
		if (((String) provinciaN.getSelectedItem()).equals("--"))
			return 5;
		if (residenza.getText().equals("")
				|| !residenza.getText().matches(patternNome))
			return 6;
		if (((String) provinciaR.getSelectedItem()).equals("--"))
			return 7;
		if (numeroDocumento.getText().contains(" "))
			return 8;
		if (chooser2.getCalendar() == null)
			return 9;
		String regex = "^[_A-Za-z0-9-\\+]+(\\.[_A-Za-z0-9-]+)*@[A-Za-z0-9-]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$";
		if (!email.getText().equals("") && !email.getText().matches(regex))
			return 10;
		return 0;
	}

	private boolean dataCorretta2() {
		if (dataRilascioG.getSelectedItem().equals("30"))
			return false;
		else if (dataRilascioG.getSelectedItem().equals("31"))
			return false;
		else
			return true;
	}

	private boolean dataCorretta() {
		if (dataDiNascitaG.getSelectedItem().equals("30"))
			return false;
		else if (dataDiNascitaG.getSelectedItem().equals("31"))
			return false;
		else
			return true;
	}

	private void tuttiNeri() {
		nomeL.setForeground(Color.BLACK);
		cognomeL.setForeground(Color.BLACK);
		residenzaL.setForeground(Color.BLACK);
		numeroDocumentoL.setForeground(Color.BLACK);
		comuneDiNascitaL.setForeground(Color.BLACK);
		provinciaL1.setForeground(Color.BLACK);
		provinciaL2.setForeground(Color.BLACK);
		dataDiNascitaL.setForeground(Color.BLACK);
		dataRilascioL.setForeground(Color.BLACK);
		emailL.setForeground(Color.BLACK);
	}

	private void aggiungiRiga() throws SQLException {
		int c = 0;
		int count = g.modelClienti.getRowCount();
		count++;
		rs = g.database.stat
				.executeQuery("SELECT nome,cognome,DATE_FORMAT(datadinascita,'%d/%m/%Y'),numerodidocumento,DATE_FORMAT(datadiarrivo,'%d/%m/%Y') FROM CLIENTI");
		ResultSetMetaData md = rs.getMetaData();
		int columnCount = md.getColumnCount();
		row = new Vector<String>(columnCount);
		if (count == 0) {
			for (int i = 2; i <= columnCount; i++) {
				row.add(rs.getString(i));
			}
			g.modelClienti.addRow(row);
		} else {
			while (rs.next()) {
				c++;
				if (count == c) {
					for (int i = 1; i <= columnCount; i++) {
						row.add(rs.getString(i));
					}
					g.modelClienti.addRow(row);
				}
			}
		}

	}
}